Argument `id`: Invalid value provided. Expected Int, provided String в nestjs API

Ошибка, которую вы видите, связана с тем, что Prisma ожидает значение типа Int для поля id, но вы передаете строку (String). Это происходит из-за того, что в вашем коде значение id передается как строка, а не как число.


Причина ошибки

В Prisma, если поле id в вашей модели определено как Int, то при вызове метода findUnique вы должны передавать значение типа number. Однако в вашем коде вы передаете строку "2", что вызывает ошибку.Пример вашей строки кода:

typescript

return this.prisma.documents.findUnique({
  where: {
    id: "2", // Здесь передается строка вместо числа
  },
});


Решение

  1. Убедитесь, что id передается как число: Если id приходит из параметров запроса (например, @Param()), то он будет строкой по умолчанию. Вам нужно преобразовать его в число перед передачей в Prisma.Исправленный код:typescriptasync getOneDocuments(id: number) { return this.prisma.documents.findUnique({ where: { id: Number(id), // Преобразуем строку в число }, }); }
  2. Используйте декоратор @Param с преобразованием: Если вы используете @Param() в контроллере, убедитесь, что значение параметра преобразуется в число. Для этого можно использовать встроенный ParseIntPipe от NestJS.Пример контроллера:typescriptimport { Controller, Get, Param, ParseIntPipe } from '@nestjs/common'; import { DocumentsService } from './documents.service'; @Controller('documents') export class DocumentsController { constructor(private readonly documentsService: DocumentsService) {} @Get(':id') async getOneDocument(@Param('id', ParseIntPipe) id: number) { return this.documentsService.getOneDocuments(id); } } Здесь ParseIntPipe автоматически преобразует строку в число перед передачей в метод.
  3. Проверьте модель Prisma: Убедитесь, что поле id в вашей модели Prisma действительно имеет тип Int. Откройте файл schema.prisma и проверьте определение модели documents:prismamodel documents { id Int @id @default(autoincrement()) title String documentDate DateTime // другие поля... } Если поле id имеет тип String, то ошибка вызвана несоответствием типов. В таком случае либо измените тип id на Int, либо передавайте строку в запросе.
  4. Проверка данных в запросе: Если вы передаете id из тела запроса или параметров, убедитесь, что оно корректно преобразуется в число.

Итоговый код

Сервис (documents.service.ts):

typescript

import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';

@Injectable()
export class DocumentsService {
  constructor(private prisma: PrismaService) {}

  async getOneDocuments(id: number) {
    return this.prisma.documents.findUnique({
      where: {
        id: Number(id), // Преобразуем строку в число
      },
    });
  }
}

Контроллер (documents.controller.ts):

typescript

import { Controller, Get, Param, ParseIntPipe } from '@nestjs/common';
import { DocumentsService } from './documents.service';

@Controller('documents')
export class DocumentsController {
  constructor(private readonly documentsService: DocumentsService) {}

  @Get(':id')
  async getOneDocument(@Param('id', ParseIntPipe) id: number) {
    return this.documentsService.getOneDocuments(id);
  }
}


Проверка

  1. Запустите приложение:bashnpm run start
  2. Выполните запрос:bashGET http://localhost:3000/documents/2 Если документ с id = 2 существует, вы получите его данные. Если нет, Prisma вернет null.

Дополнительные рекомендации

  • Если вы используете Swagger, добавьте описание параметра id в контроллере:typescriptimport { ApiParam } from '@nestjs/swagger'; @ApiParam({ name: 'id', type: Number, description: 'ID документа' }) @Get(':id') async getOneDocument(@Param('id', ParseIntPipe) id: number) { return this.documentsService.getOneDocuments(id); }
  • Если вы хотите обработать случай, когда документ не найден, добавьте проверку:typescriptasync getOneDocuments(id: number) { const document = await this.prisma.documents.findUnique({ where: { id: Number(id) }, }); if (!document) { throw new NotFoundException(`Document with ID ${id} not found`); } return document; }

Теперь ваш код будет корректно работать с параметром id и обрабатывать ошибки. 😊